#ifndef OBJETSCENE_H
#define OBJETSCENE_H

/*
 *  @autheur : LEMOUEL Florian
 *  @date : 04.04.2013
 *  @version 1.0 : création de la classe complète
 *  @version 1.1 : LMF, le 11.04.2013.
 *                 Ajout du materiau de la face
 *                 Ajout de l'habillage de la face
 *                 Ajout des transformations
 *  @version 1.2 : LMF, le 30.04.2013
 *                 Ajout de la sérialisation
 *                 Ajout de l'attribut _ensemblePointsFaces,
 *                 celui-ci permet de supprimer proprement les pointeurs sur les points
 */

#include <QList>
#include "face.h"
#include "materiaux.h"
#include "habillage.h"
#include "hcouleur.h"
#include "transformation.h"

#include "boost/serialization/serialization.hpp"
#include <boost/serialization/export.hpp>


/*
 * Classe représentant un objet d'une scène 3D.
 */
class ObjetScene
{
 //--------------------- Constructeurs et destructeur -------------------
public:

    //Constructeur par défault
    ObjetScene();

    //Constructeur avec une liste de faces
    ObjetScene(QList<Face*>  faces);

    //Constructeur avec une liste de faces et la liste des points composant les faces.
    ObjetScene(QList<Face*>  faces, QList<Point*> ensemblePoints);

    //Constructeur avec une liste de faces, un habillage et un materiau
    ObjetScene(QList<Face*>  faces, Habillage& habillage, Materiaux& materiau);

    //Constructeur avec une liste de faces, un habillage, un materiau et une liste de transformations
    ObjetScene(QList<Face*>  faces, Habillage& habillage, Materiaux& materiau, QList<Transformation*> transformations);

    //Constructeur par recopie
    ObjetScene(const ObjetScene& objetScene);

    //Destructeur
    ~ObjetScene();
    //----------------------------------------------------------------------
    //--------------------- Méthodes ---------------------------------------

    //Fonction permettant d'ajouter une face
    void ajouterFace(Face& face, bool majListePoints = true);

    //Fonction permettant d'ajouter une transformation
    void ajouterTransformation(Transformation& transformation);

    //Fonction permettant de récupérer le nombre de faces
    int getNbFaces();

    //Fonction permettant de supprimer une face
    void supprimerFace(int i);

    //Fonction renvoyant le centre de gravité de l'objet
    Point& getCentreGravite();

    //Fonction de dessin
    void dessiner();

private:

    //Mise à jour de la liste des  points de l'objet pour une face
    void majPointsObjet(Face& face);

    //Mise à jour de la liste des  points de l'objet pour une liste de faces
    void majPointsObjet(QList<Face*> listeFaces);

    //----------------------------------------------------------------------
    //--------------------- Accesseurs -------------------------------------
public:

    //Accesseur sur le materiau
    Materiaux& getMateriau();

    //Accesseur sur l'habillage
    Habillage& getHabillage();

    //Mutateur sur l'habillage
    void setHabillage(Habillage& h);

    //----------------------------------------------------------------------
    //--------------------- Surcharge des opérateurs -----------------------

    //----------------------------------------------------------------------
    //--------------------- Attributs --------------------------------------
private:
    QList<Face*> _faces;
    Materiaux* _materiau;
    Habillage* _habillage;
    QList<Transformation*> _transformations;
    QList<Point*> _ensemblePointsFaces;
    //----------------------------------------------------------------------
    //--------------------- Sérialisation ----------------------------------
    private:
        friend class boost::serialization::access;

        template<class Archive>
        void serialize(Archive & ar, const unsigned int version) {
                ar & _faces;
                ar & _materiau;
                ar & _habillage;
                ar & _transformations;
                ar & _ensemblePointsFaces;
        }
    //----------------------------------------------------------------------
};

#endif // OBJETSCENE_H
